﻿using System.Collections.Generic;
using System.Transactions;
using Dogshow.BusinessLogic.Services;
using Dogshow.BusinessLogic.Utils;
using Dogshow.Infrastructure.Exceptions;
using Dogshow.Model;
using Dogshow.Web.Models;
using DogshowRepository;

namespace Dogshow.BusinessLogic.Managers
{
    public class RegistracijaNalogaManager
    {
        private readonly IEncryptor m_Encryptor;

        private readonly IKorisniciRepository m_KorisniciRepository;

        private readonly IMestaRepository m_MestaRepository;

        private readonly IKinoloziRepository m_KinoloziRepository;

        private readonly INotificationService m_NotificationService;

        public RegistracijaNalogaManager(IEncryptor encryptor, IKorisniciRepository korisniciRepository, IMestaRepository mestaRepository, 
            IKinoloziRepository kinoloziRepository, INotificationService notificationService)
        {
            m_Encryptor = encryptor;
            m_KorisniciRepository = korisniciRepository;
            m_MestaRepository = mestaRepository;
            m_KinoloziRepository = kinoloziRepository;
            m_NotificationService = notificationService;
        }

        public void RegistrujKorisnika(string korisnickoIme, string imeIPrezime, string lozinka, string adresa, string nazivMesta, string telefon, string email)
        {
            if (m_KorisniciRepository.PostojiKorisnik(korisnickoIme))
            {
                throw new KorisnikPostojiException();
            }
            using (var ts = new TransactionScope())
            {
                int? idMesta = null;
                if (!string.IsNullOrEmpty(nazivMesta))
                {
                    var prvaZagrada = nazivMesta.IndexOf('(');
                    var zadnjaZagrada = nazivMesta.IndexOf(')');
                    var nazivMestaDeo = nazivMesta.Substring(zadnjaZagrada, nazivMesta.Length - zadnjaZagrada).Trim();
                    if (prvaZagrada != -1 && zadnjaZagrada != -1)
                    {
                        var postanskiBrojDeo = nazivMesta.Substring(prvaZagrada + 1, zadnjaZagrada - prvaZagrada - 1);
                        if (!string.IsNullOrEmpty(postanskiBrojDeo))
                        {
                            var mesto = m_MestaRepository.VratiPoPostanskomBroju(postanskiBrojDeo);
                            if (mesto == null)
                            {
                                idMesta = m_MestaRepository.Sacuvaj(new Mesto() { PostanskiBroj = postanskiBrojDeo, Naziv = nazivMestaDeo });
                                m_NotificationService.PosaljiObavestenjeAdministratoru("Kreirano je novo mesto: " + nazivMestaDeo);
                            } else
                            {
                                idMesta = mesto.Id;
                            }
                        }
                        else
                        {
                            var mesto = new Mesto { PostanskiBroj = nazivMestaDeo.Substring(10), Naziv = nazivMestaDeo};
                            idMesta = m_MestaRepository.Sacuvaj(mesto);
                            m_NotificationService.PosaljiObavestenjeAdministratoru("Kreirano je novo mesto: " + nazivMestaDeo);
                        }
                    }
                }
                var idKinologa = m_KinoloziRepository.Sacuvaj(new Kinolog());
                var korisnik = new Korisnik
                {
                    KorisnickoIme = korisnickoIme,
                    Naziv = imeIPrezime,
                    Lozinka = m_Encryptor.Encrypt(lozinka),
                    Adresa = adresa,
                    IdMesta = idMesta,
                    Telefon = telefon,
                    Email = email,
                    VrstaKorisnika = VrsteKorisnika.Korisnik,
                    IdKinologa = idKinologa,
                    Aktivan = true,
                };
                m_KorisniciRepository.Sacuvaj(korisnik); 
                m_NotificationService.PosaljiObavestenjeAdministratoru("Kreiran je novi korinsik: " + korisnickoIme);
                ts.Complete();
            }
        }

        public IEnumerable<Mesto> VratiMesta()
        {
            return m_MestaRepository.VratiSve();
        }
    }
}